<?php

namespace WebmanGrpc;

use Workerman\Connection\ConnectionInterface;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Worker;

/**
 * gRPC进程类
 * 
 * 处理gRPC请求的Workerman进程，负责：
 * - 启动gRPC服务器
 * - 处理gRPC请求
 * - 调用注册的服务方法
 * - 返回gRPC响应
 */
class Process
{
    /**
     * gRPC服务器实例
     */
    protected \Grpc\Server $server;
    
    /**
     * Worker实例
     */
    protected Worker $worker;
    
    /**
     * 构造函数
     */
    public function __construct()
    {
        // 初始化gRPC
        $config = config('plugin.endcms.webman-grpc.grpc', []);
        Grpc::init($config);
        
        // 创建gRPC服务器
        $this->server = Grpc::createServer();
        
        // 注册所有服务
        $this->registerServices();
    }
    
    /**
     * 启动进程
     * 
     * @param Worker $worker Worker实例
     * @return void
     */
    public function onWorkerStart(Worker $worker): void
    {
        $this->worker = $worker;
        
        // 获取监听地址和端口
        $listen = $worker->listen;
        $address = parse_url($listen);
        $host = $address['host'] ?? '0.0.0.0';
        $port = $address['port'] ?? 50051;
        
        // 绑定服务器
        $this->server->bind($host, $port);
        
        // 启动服务器
        $this->server->start();
        
        echo "gRPC server started on {$host}:{$port}\n";
    }
    
    /**
     * 注册所有服务
     * 
     * @return void
     */
    protected function registerServices(): void
    {
        $services = Grpc::getServices();
        
        foreach ($services as $serviceName => $serviceInfo) {
            $className = $serviceInfo['class'];
            
            // 创建服务实例
            $serviceInstance = new $className();
            
            // 添加服务到服务器
            $this->server->addService($serviceName, $serviceInstance);
            
            echo "Registered gRPC service: {$serviceName}\n";
        }
    }
    
    /**
     * 处理连接
     * 
     * @param ConnectionInterface $connection 连接实例
     * @return void
     */
    public function onConnect(ConnectionInterface $connection): void
    {
        // 连接建立时的处理
    }
    
    /**
     * 处理消息
     * 
     * @param ConnectionInterface $connection 连接实例
     * @param mixed $message 消息内容
     * @return void
     */
    public function onMessage(ConnectionInterface $connection, $message): void
    {
        // 消息处理
        // gRPC协议处理由底层扩展完成
    }
    
    /**
     * 处理连接关闭
     * 
     * @param ConnectionInterface $connection 连接实例
     * @return void
     */
    public function onClose(ConnectionInterface $connection): void
    {
        // 连接关闭时的处理
    }
    
    /**
     * 处理错误
     * 
     * @param Worker $worker Worker实例
     * @param int $errno 错误码
     * @param string $errmsg 错误信息
     * @return void
     */
    public function onError(Worker $worker, int $errno, string $errmsg): void
    {
        echo "gRPC server error: [{$errno}] {$errmsg}\n";
    }
}